// 矩阵乘法
import {identity3d, identity4d} from "@/views/cg/lib/matrix/indentity.ts";
/**
 * m*n 和 p*q 的两个矩阵相乘
 * 复杂度： O(m*n*q) n == p
 * 可优化（分治策略）
 * @param {*} a
 * @param {*} b
 * @param {*} m
 * @param {*} n
*/

export function multiply(a, b, m, p){
  const n = a.length / m
  const q = b.length / p
  if( n !== p){
    throw "cannot apply multiplication:matrix shape not match"
  }

  const r= [m * q]
  for(let j=0; j<q; j++ ){
    for(let i=0; i<m;i++){
      let s= 0;
      for(let k=0; k<n; k++){
        s += a[k + i*n] * b[j + k*q]
      }
      r[i * q + j] = s
    }
  }
  return r
}

// 图形学的人反而是用最原始的一个个算  a b 是3*3的矩阵
/*function mutiply3d(a,b){
  return [
    a[0] * b[0] + a[1] * b[3] + a[2] * b[6], // 第一项
    a[0] * b[1] + a[1] * b[4] + a[2] * b[9], // 第二项
    ....
  ]
}*/

export function multiply3(...matrixes){
  return matrixes.reduce((a,b) => multiply(a, b, 3, 3), identity3d())
}

export function multiply4(...matrixes){
  return matrixes.reduce((a,b) => multiply(a, b, 4, 4), identity4d())
}
